package main

import (
	"sync"
	"time"
)
/**
一次性事件使用close效率更好，没有多余的开销，连续或多样性事务，
可传递不同数据标志实现，还可以使用sync.Cond实现单播或广播事件
 */
func main() {
	var wg sync.WaitGroup
	ready := make(chan struct{})

	for i := 0; i < 3; i++ {
		wg.Add(1)
		go func(id int) {
			defer wg.Done()
			//运动员准备就绪
			println(id,":ready.")
			//等待发令
			<- ready
			println(id,":running...")
		}(i)
	}

	time.Sleep(time.Second)
	println("ready? Go!")
	//砰
	close(ready)
	wg.Wait()
}
